import { getPreviousEl } from './get-previous-el'

/**
 * 判断目标元素的左边界是否与其前面一个元素（在目标元素左边一个的元素）的右边界接触
 *
 * @param {Element} el 目标元素
 * @returns {boolean} true 表示目标元素的左边界与其前面一个元素的右边界接触，false 表示不接触。
 * - 如果目标元素为其父元素的子元素列表中的第一个元素，则判断目标元素的左边界是否与父元素的左边界接触；
 * - 如果目标元素的父元素不存在，则视为目标元素的左边界与其前面一个元素的右边界接触，返回 true；
 * - 如果目标元素的左边界与父元素的左边界接触，则递归判断目标元素的父元素的前面一个元素的右边界是否与目标元素的父元素的
 * 左边界接触
 */
export const isContactPrevious = (el: Element): boolean => {
  const previousEl = getPreviousEl(el)
  // 如果目标元素在父元素的子元素列表中的前一个元素不存在，则判断目标元素的左边界是否与父元素的左边界接触
  if (!previousEl) {
    const parentEl = el.parentElement
    // 如果目标元素的父元素不存在，则视为目标元素的左边界与其前面一个元素的右边界接触，返回 true
    if (!parentEl) return true
    // 判断目标元素的左边界是否与父元素的左边界接触
    const isContact = parentEl.getBoundingClientRect().left >= el.getBoundingClientRect().left
    if (!isContact) return false
    // 如果目标元素的左边界与父元素的左边界接触，则递归判断目标元素的父元素的前面一个元素的右边界是否与目标元素的父元素
    // 的左边界接触
    return isContactPrevious(parentEl)
  }
  return previousEl.getBoundingClientRect().right >= el.getBoundingClientRect().left
}

export type IsContactPreviousType = typeof isContactPrevious
